package icontext

import (
	"context"
	"fmt"
	"nd-app/pkg/logger"
	"time"
)

type NdContext struct {
	ctx    context.Context
	cancel context.CancelFunc
}

var ndCtxt *NdContext

func Init() error {
	var err error
	ndCtxt = &NdContext{}

	ctx, cancel := context.WithCancel(context.Background())
	ndCtxt.ctx = ctx
	ndCtxt.cancel = cancel

	err = InitWeb()
	if err != nil {
		return err
	}
	err = InitSystem()
	if err != nil {
		return err
	}
	err = InitRadio()
	if err != nil {
		return err
	}

	return nil
}

func Final() error {
	ndCtxt = nil
	return nil
}

func Start() error {
	defer func() {
		err := recover()
		if err != nil {
			logger.AppLog.Error("nd start panic:", err)
		}
	}()

	if ndCtxt == nil {
		return fmt.Errorf("ndCtxt is nil")
	}

	ticker := time.NewTicker(1 * time.Second)
	for {
		select {
		case <-ndCtxt.ctx.Done():
			return nil
		case <-ticker.C:
			updateSystemStat()
			updateRadioStat()
		}
	}

	return nil
}

func Wait() error {
	if ndCtxt == nil {
		return fmt.Errorf("ndCtxt is nil")
	}

	<-ndCtxt.ctx.Done()

	return nil
}

func Stop() error {
	if ndCtxt == nil {
		return fmt.Errorf("ndCtxt is nil")
	}

	ndCtxt.cancel()

	return nil
}
